﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Segmentator.IntegrityThroughInterval
{
    /**
     * Список интервалов для каждого входного символа
     */
    class Intervals: List<List<int>>
    {
        private List<long> alphabet;

        public Intervals()
        {
            Add(init());
        }
        /**
         * Инициализирует новый элемент списка
         * и возвращает его
         */
        private List<int> init()
        {
            return new List<int>();
        }

        /**
         * Добавление нового значения к существующеме елементу
         * списка
         */
        public void add(int i, int element)
        {
            if (this.Count <= i) Add(init());
            this.ElementAt(i).Add(element);
        }

        
        /**
         * Возвращает количество элементов в массиве с индексом
         * index
         */
        public int getSize(int index)
        {
            return this.ElementAt(index).Count;
        }

        /**
         * Ассоциирует с интервальной последовательностью 
         * алфавит
         */
        public void associateAlphabet(List<long> newAlphabet)
        {
            alphabet = newAlphabet;
        }

        /**
         * Возвращает алфавит(в виде натуральных чисел)
         */
        public List<long> getAlphabet()
        {
            return alphabet;
        }

        public void set(int i, int j, int num)
        {
            this.ElementAt(i).Insert(j, num);   
        }

        public int get(int i, int j)
        {
            return this.ElementAt(i).ElementAt(j);
        }

        /**
         * Сортировка массивов интервалов по убыванию
         */
        public Intervals exchange()
        {
            int[] mas = null;
            long buf = 0;
            for (int i = 0; i < Count - 1; i++)
            {
                for (int j = i + 1; j < Count; j++)
                {
                    if (this.ElementAt(i).Count < this.ElementAt(j).Count )
                    {
                        mas = new int[this.ElementAt(i).Count];
                        this.ElementAt(i).CopyTo(mas);
                        
                        Insert(i, this.ElementAt(j));
                        
                        Insert(j, mas.ToList());
                  //      sortAlphabet(i, j);
                        RemoveAt(i + 1);
                        RemoveAt(j + 1);
                    }
                }
            }
            return this;
        }
        /**
         * Сортировка алфавита по убыванию
         */
        private void sortAlphabet(int i, int j)
        {
            long buf;
            buf = alphabet.ElementAt(i);
            alphabet[i] = alphabet[j];
            alphabet[j] = buf;
        }
    }
}
